package game.msgame.dao;

import game.msgame.constant.USERCONSTANT;
import game.msgame.entity.User;

import java.util.List;
import java.util.Objects;

/**
 * 用户信息数据类
 * 负责提供对用户注册、查找等服务
 *
 * @author Mr.Alpaca
 * @version 1.0.0
 */
public class UserDao {
    /**
     * 单例对象,懒加载
     */
    private static UserDao dao;

    private UserDao() {
    }

    /**
     * 获取单例对象,使用DCL机制
     *
     * @return 单例对象
     */
    public static UserDao getDao() {
        if (dao == null) {
            synchronized (UserDao.class) {
                if (dao == null) {
                    dao = new UserDao();
                }
            }
        }
        return dao;
    }

    /**
     * 插入用户
     * 1.判断用户是否已存在,不存在则进行下一步
     * 2.插入列表
     *
     * @param user 用户
     * @return 插入结果, 若用户已存在则直接返回false
     */
    public boolean insertUser(User user) {
        boolean exist = USERCONSTANT.USER_LIST.contains(user);
        if (exist) {
            return false;
        }
        return USERCONSTANT.USER_LIST.add(user);
    }

    /**
     * 根据用户id获取用户对象
     *
     * @param id 用户id
     * @return 用户对象, null表示无该对象
     */
    public User selectUser(Long id) {
        return USERCONSTANT.USER_LIST.parallelStream()
                .filter(user -> Objects.equals(id, user.getId()))
                .findAny()
                .orElse(null);
    }

    /**
     * 获取当前用户列表
     *
     * @return 用户列表
     */
    public List<User> selectAllUser() {
        return USERCONSTANT.USER_LIST;
    }

    /**
     * 更新指定用户
     *
     * @param user 用户
     */
    public void updateUser(User user) {
        User oldUser = selectUser(user.getId());
        oldUser.setPassword(user.getPassword());
        oldUser.setSocket(user.getSocket());
        oldUser.setOnlineFlag(user.isOnlineFlag());
    }

    /**
     * 根据用户id删除指定用户
     *
     * @param id 用户id
     * @return 删除结果
     */
    public boolean deleteUser(long id) {
        for (User user : USERCONSTANT.USER_LIST) {
            if (user.getId() == id) {
                USERCONSTANT.USER_LIST.remove(user);
                return true;
            }
        }
        return false;
    }
}
